package main

import "fmt"

// 为什么需要接口
type dog struct{}

func (d dog) say() {
	fmt.Println("汪汪汪。。。")
}

type cat struct{}

func (c cat) say() {
	fmt.Println("喵喵喵。。。")
}

type person struct {
	name string
}

func (p person) say() {
	fmt.Println("啊啊啊。。。")
}

// 接口不管什么类型，只管实现什么方法
// 定义一个抽象的类型，只要实现了say这个方法的类型都可以称为sayer的类型
type sayer interface {
	say()
}

// 打的函数
func da(org sayer) {
	// 不管是传进来的是什么，我都要打，执行say方法
	org.say()
}

func main() {
	c1 := cat{}
	da(c1)
	d1 := dog{}
	da(d1)
	p1 := person{
		name: "nice",
	}
	da(p1)

	var s sayer
	c2 := cat{}
	s = c2
	fmt.Println(s)
}
